/*!
 * @file
 * @brief 状态相关宏定义
 */

#pragma once

/*-----------------------------------------------------------------------------
 * HEADER FILES
 *---------------------------------------------------------------------------*/
#include <stdio.h>

/*-----------------------------------------------------------------------------
 * ENUM
 *---------------------------------------------------------------------------*/
// 函数调用状态
typedef enum gmi_status_e
{
    GMI_STATUS_OK = 0,                  ///< 正常
    GMI_STATUS_ERROR,                   // 错误
    GMI_STATUS_BUSY,                    // 繁忙
    GMI_STATUS_TIMEOUT,                 // 超时
    GMI_STATUS_PARAM_INVALID,           // 非法参数
    GMI_STATUS_HANDLE_NULL,             // 空句柄
    GMI_STATUS_RECURSION_OUT_OF_TIMES,  // 超过最大递归次数
    GMI_STATUS_FATAL  // 致命错误
} GMI_STATUS;

/*-----------------------------------------------------------------------------
 * FUNCTIONS DECLARATION
 *---------------------------------------------------------------------------*/
/**
 * @brief 打印输出状态
 * @param {GMI_STATUS} status
 * @return {*}
 */
void print_out_status(GMI_STATUS status);

/*-----------------------------------------------------------------------------
 * MACRO DEFINITIONS
 *---------------------------------------------------------------------------*/
#define CHECK_STATUS(x)          \
    {                            \
        if (x != GMI_STATUS_OK)  \
        {                        \
            print_out_status(x); \
            return x;            \
        }                        \
    }

#define CHECK_HANDLE(x)                    \
    {                                      \
        if (x == NULL)                     \
        {                                  \
            return GMI_STATUS_HANDLE_NULL; \
        }                                  \
    }

#define CHECK_NULL(x)                      \
    {                                      \
        if (x == NULL)                     \
        {                                  \
            return GMI_STATUS_HANDLE_NULL; \
        }                                  \
    }
